/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algoritmo2;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author Ra
 */
public class Individuo {

    private Arbol arbol;
    private int hmax;
    private double aptitud;
    private double evaluacion;
    private double puntuacion;
    private double punt_acu;
    private boolean completa;
    private Map<String, Integer>[] arrayValores;
    private List<String> cjtoFun;
    private List<String> cjtoTer;

    public Individuo(int hmax, boolean completa, List<String> cjtoFun, List<String> cjtoTer) {
        this.hmax = hmax;
        this.completa = completa;
        arrayValores = generarDatos();
        this.cjtoFun = cjtoFun;
        this.cjtoTer = cjtoTer;
    }

    public Individuo(Individuo individuo) {
        this.arbol = individuo.getArbol();
        this.hmax = individuo.getHmax();
        this.aptitud = individuo.getAptitud();
        this.evaluacion = individuo.getEvaluacion();
        this.puntuacion = individuo.getPuntuacion();
        this.punt_acu = individuo.getPunt_acu();
    }

    public Individuo Clone() {
        Individuo indi = new Individuo(this.hmax, this.completa, this.cjtoFun, this.cjtoTer);
        indi.setPunt_acu(this.punt_acu);
        indi.setPuntuacion(this.puntuacion);
        indi.setEvaluacion(this.evaluacion);
        indi.setArbol(this.arbol.Clone(null));
        indi.setArrayValores(this.arrayValores);
        indi.setAptitud(this.getAptitud());
        return indi;
    }

    public double evalua(double rate) {
        double rating = 1;
        if(arbol.comprobarBuenaConstruccionArbol()){
            rating = rate;
        }
        
        int aciertos = 0;
        int fallos = 0;
        for (int i = 0; i < arrayValores.length; i++) {
            int resultado = arbol.evalua(arrayValores[i]);
            if (resultado == arrayValores[i].get("S")) {
                aciertos++;
            } else {
                fallos++;
            }
        }
        return aciertos*rating;
    }

    public void inicializaCromosoma() {
       
        arbol = new Arbol(this.cjtoFun,this.cjtoTer, hmax, 0, null, false, true, false, completa);
        
        
        arbol.reestablecerNumNodos();
        arbol.reestablecerProfundidad(0);
    }

    public void reestablecerProfundidad(){
        this.arbol.reestablecerProfundidad(0);
    }

    public void reestablecerNumNodos(){
        this.arbol.reestablecerNumNodos();
    }

    public static Map<String, Integer>[] generarDatos() {
        Map<String, Integer>[] maps = new HashMap[64];
        int i = 0;
        for (int a0 = 0; a0 < 2; a0++) {
            for (int a1 = 0; a1 < 2; a1++) {
                for (int d0 = 0; d0 < 2; d0++) {
                    for (int d1 = 0; d1 < 2; d1++) {
                        for (int d2 = 0; d2 < 2; d2++) {
                            for (int d3 = 0; d3 < 2; d3++) {
                                maps[i] = new HashMap<String, Integer>();
                                maps[i].put("A0", a0);
                                maps[i].put("A1", a1);
                                maps[i].put("D0", d0);
                                maps[i].put("D1", d1);
                                maps[i].put("D2", d2);
                                maps[i].put("D3", d3);
                                if (a1 == 0 && a0 == 0) {
                                    maps[i].put("S", d0);
                                } else if (a0 == 1 && a1 == 0) {
                                    maps[i].put("S", d1);
                                } else if (a0 == 0 && a1 == 1) {
                                    maps[i].put("S", d2);
                                } else {
                                    maps[i].put("S", d3);
                                }
                                i++;
                            }
                        }
                    }
                }
            }
        }
        return maps;
    }

    public List<String> getCjtoFun() {
        return cjtoFun;
    }

    public void setCjtoFun(List<String> cjtoFun) {
        this.cjtoFun = cjtoFun;
    }

    public List<String> getCjtoTer() {
        return cjtoTer;
    }

    public void setCjtoTer(List<String> cjtoTer) {
        this.cjtoTer = cjtoTer;
    }

    public double getAptitud() {
        return aptitud;
    }

    public void setAptitud(double aptitud) {
        this.aptitud = aptitud;
    }

    public Arbol getArbol() {
        return arbol;
    }

    public void setArbol(Arbol arbol) {
        this.arbol = arbol;
    }

    public double getEvaluacion() {
        return evaluacion;
    }

    public void setEvaluacion(double evaluacion) {
        this.evaluacion = evaluacion;
    }

    public int getHmax() {
        return hmax;
    }

    public void setHmax(int hmax) {
        this.hmax = hmax;
    }

    public double getPunt_acu() {
        return punt_acu;
    }

    public void setPunt_acu(double punt_acu) {
        this.punt_acu = punt_acu;
    }

    public double getPuntuacion() {
        return puntuacion;
    }

    public void setPuntuacion(double puntuacion) {
        this.puntuacion = puntuacion;
    }

    public Map<String, Integer>[] getArrayValores() {
        return arrayValores;
    }

    public void setArrayValores(Map<String, Integer>[] arrayValores) {
        this.arrayValores = arrayValores;
    }

    public boolean isCompleta() {
        return completa;
    }

    public void setCompleta(boolean completa) {
        this.completa = completa;
    }




}
